package com.ruixi.spring.usermod.controller;

import com.ruixi.spring.usermod.service.UserService;
import com.ruixi.spring.usermod.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;


/*
 * 基于注解的组件化管理:
 * @Component(如果不是下面三个中的任何一个,则使用该注解)
 * @Controller(控制层)
 * @Service(业务层)
 * @Repository(持久层)
 * 以上四个注解功能完全相同,但在实际开发中,要在实现不同功能的类上加上相应的注解
 *
 * 完成组件化管理的过程:
 *      1、在需要被spring管理的类上加上相应注解
 *      2、在配置文件中通过<context:component-scan>对所设置的包结构进行扫描,就会将加上注解的类,作为spring的组件进行加载
 *          组件:指spring中管理的bean
 *          作为spring的组件进行加载:会自动在spring的配置文件中生成相对应的bean,这些bean的id会以类的首字母小写为值
 *          也可以通过@Controller("beanId")为自动生成的bean指定id
 * 自动装配:在需要赋值的非字面量属性上,加上@Autowired,就可以在spring容器中,通过不同的方式匹配到相对应的bean
 * @Autowired装配时,会默认使用byType的方式,此时要求spring容器中只有一个能够为其赋值
 * 若自动装配时,匹配到多个能够赋值的bean,可使用@Qualifier(value="beanId")指定赋值的bean,此时要求spring容器中,有一个bean的id和属性名一致
 * @Autowired和@Qualifier(value="beanId")可以一起作用于一个属性上
 *
 * 与@Autowired类似的一个注解为@Resource,该注解和@Autowired作用完全相同,单纯使用@Resource为根据类型注入,若使用@Resource(name="")则为根据名称注入
 */

//@Controller(value = "aaa") //value的作用是控制自动生成的bean标签的id,一旦设置了value,就不再以默认首字母小写作为其id,若只有一个需要设置的属性,则可以省略value,否则不能省略
@Controller("aaa")
public class UserController {

    //原始写法
    //private UserService userService = new UserServiceImpl();

    @Autowired
    private UserService userService;

    public void addUser(){
        this.userService.addUser();
    }

    public UserController() {
        System.out.println("UserController");
    }

}
